package co.gov.medellin.sdep.sisdep.common;

import java.io.Serializable;
import java.text.MessageFormat;

public class SISDEPException extends Exception implements SISDEPThrowable, Serializable {

	/** Serial key. */
	private static final long serialVersionUID = 2546514753751221860L;
	
	/** Mensaje de excepcion. */
	private String message;
	
	/** Clave para ser usada en la localizacion de mensajes de excepcion. */
	private String messageKey;

	/** Argumentos que van asociados al mensaje. */
	private Object[] messageArguments;
	
	
	/**
	 * Default Constructor.
	 */
	private SISDEPException() {
		super();
	}

	/**
	 * Obtiene el parametro message.
	 * @see SISDEPException#message
	 *
	 * @return El parametro message.
	 */
	public String getMessage() {
		return message;
	}

	/**
	 * Obtiene el parametro messageKey.
	 * @see SISDEPException#messageKey
	 *
	 * @return El parametro messageKey.
	 */
	public String getMessageKey() {
		return messageKey;
	}

	/**
	 * Obtiene el parametro messageArguments.
	 * @see SISDEPException#messageArguments
	 *
	 * @return El parametro messageArguments.
	 */
	public Object[] getMessageArguments() {
		return messageArguments;
	}
	
	/**
	 * Construye una excepcion con toda la informacion acerca de la causa de la excepcion.
	 * 
	 * @param cause Informacion original de la excepcion o error.
	 */
	public SISDEPException(Throwable cause) {
		super(cause);
	}

	/**
	 * Construye una excepcion con un mensaje.
	 * 
	 * @param message Mensaje de excepcion.
	 */
	public SISDEPException(String internalMessage) {
		super(internalMessage);
	}

	/**
	 * Construye una excepcion con un mensaje y con su clave respectiva.
	 * 
	 * @param internalMessage Mensaje de excepcion.
	 * @param messageKey Clave asociada al mensaje de excepcion.
	 */
	public SISDEPException(String internalMessage, String messageKey) {
		super(internalMessage);
		this.messageKey = messageKey;
	}

	/**
	 * Construye una excepcion con un mensaje de error que contiene paramtros a ser 
	 * remplazados por los argumentos enviados.
	 * 
	 * @param internalMessage Mensaje que contiene formatos del tipo (%s) a
	 *            ser remplazados por los argumetnos del parametro args.
	 * @param args Arreglo de objetos que se remplazaran por los parametros en el mensaje.
	 */
	public SISDEPException(String internalMessage, Object args) {
		super(MessageFormat.format(internalMessage, (Object[]) args));
		this.messageArguments = (Object[]) args;
	}

	/**
	 * Construye una excepcion con un mensaje de error que contiene paramtros a ser 
	 * remplazados por los argumentos enviados, ademas se almacena su clave de identificacion.
	 * 
	 * @param internalMessage Mensaje que contiene formatos del tipo (%s) a
	 *            ser remplazados por los argumetnos del parametro args.
	 * @param messageKey Clave de identificacion del mensaje.
	 * @param args Arreglo de objetos que se remplazaran por los parametros en el mensaje.
	 */
	public SISDEPException(String internalMessage, String messageKey, Object args) {
		super(MessageFormat.format(internalMessage, (Object[]) args));
		this.messageArguments = (Object[]) args;
		this.messageKey = messageKey;
	}
		
	/**
	 * Construye una excepcion con un mensaje de error que contiene paramtros a ser 
	 * remplazados por los argumentos enviados y que ademas contiene toda la informacion 
	 * acerca de la causa de la excepcion.
	 * 
	 * @param internalMessage Mensaje que contiene formatos del tipo (%s) a
	 *            ser remplazados por los argumetnos del parametro args.
	 * @param messageKey Clave de identificacion del mensaje.
	 * @param args Arreglo de objetos que se remplazaran por los parametros en el mensaje.
	 * @param cause Informacion acerca de la causa de la excepcion.
	 */
	public SISDEPException(String internalMessage, String messageKey, Object args, Throwable cause) {
		super(MessageFormat.format(internalMessage, (Object[]) args), cause);
		this.messageArguments = (Object[]) args;
		this.messageKey = messageKey;
	}
	
	/**
	 * Construye una excepcion con un mensaje de error que contiene paramtros a ser 
	 * remplazados por los argumentos enviados y que ademas contiene toda la informacion 
	 * acerca de la causa de la excepcion.
	 * 
	 * @param internalMessage Mensaje que contiene formatos del tipo (%s) a
	 *            ser remplazados por los argumetnos del parametro args.
	 * @param args Arreglo de objetos que se remplazaran por los parametros en el mensaje.
	 * @param cause Informacion acerca de la causa de la excepcion.
	 */
	public SISDEPException(String internalMessage, Object args, Throwable cause) {
		super(MessageFormat.format(internalMessage, (Object[]) args), cause);
		this.messageArguments = (Object[]) args;
	}
	
	/**
	 * Construye una excepcion con un mensaje de error y toda la informacion 
	 * acerca de la causa de la excepcion.
	 * 
	 * @param internalMessage Mensaje que contiene formatos del tipo (%s) a
	 *            ser remplazados por los argumetnos del parametro args.
	 * @param cause Informacion acerca de la causa de la excepcion.
	 */
	public SISDEPException(String internalMessage, Throwable cause) {
		super(internalMessage, cause);
	}
	
	/**
	 * 
	 * @param object
	 * @return
	 */
	public static Object[] renombranceObject(Object object){
		return (Object[]) object;
	}

}
